package com.lm.annotation;

import com.lm.enums.RedisLockRequire;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * @author lm
 * @date 2025/2/7 13:54
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface RedisLock {

    /**
     * 分布式锁的 key，必须：请保持唯一性，支持 spring el表达式
     *
     */
    String value();

    /**
     * 分布式锁的key类型
     */
    KeyType keyType() default KeyType.STRING;


    /**
     * 是否使用类名:方法名:作为key的前缀
     * @return
     */
    boolean useMethodNameAsKeyPrefix() default false;

    /**
     * 等待锁超时时间，默认30
     *
     */
    long waitTime() default 30;

    /**
     * 自动解锁时间，自动解锁时间一定得大于方法执行时间，否则会导致锁提前释放，默认100（根据场景配置）
     * 对时间没有把握可以使用默认的看门狗会自动续期
     */
    long leaseTime() default 100;

    /**
     * 时间单位，默认为秒
     *
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

    /**
     * 获取锁失败时，默认的错误描述
     */
    String errorMsg() default "当前繁忙，请稍后再试";

    @NoArgsConstructor(access = AccessLevel.PRIVATE)
    public static enum KeyType {
        STRING,

        SPEL,

        ;
    }
}